"""
技能管理器模块
实现游戏中技能释放的通用逻辑
"""

import time
import pyautogui
from loguru import logger

class SkillManager:
    def __init__(self):
        """初始化技能管理器"""
        self.last_skill1_time = 0  # 一技能上次释放时间
        self.last_skill2_time = 0  # 二技能上次释放时间
        self.last_ultimate_time = 0  # 大招上次释放时间
        
        # 技能释放间隔（秒）
        self.skill1_interval = 2  # 一技能间隔
        self.skill2_interval = 2  # 二技能间隔
        self.ultimate_interval = 5  # 大招间隔
        
        # 技能按键映射
        self.skill1_key = 'J'  # 一技能按键
        self.skill2_key = 'I'  # 二技能按键
        self.ultimate_key = 'L'  # 大招按键
        self.normal_attack_key = 'K'  # 普通攻击按键
        
        # 移动按键
        self.move_left_key = 'A'
        self.move_right_key = 'D'
        
        # 移动状态
        self.is_moving_right = True
        self.last_move_switch_time = 0
        self.move_duration = 10  # 每次移动持续时间（秒）

    def start_combat(self):
        """开始战斗，按住普通攻击和初始方向"""
        pyautogui.keyDown(self.normal_attack_key)
        pyautogui.keyDown(self.move_right_key)
        self.last_move_switch_time = time.time()
        logger.info("开始战斗，按住普通攻击和右方向键")

    def end_combat(self):
        """结束战斗，释放所有按键"""
        pyautogui.keyUp(self.normal_attack_key)
        pyautogui.keyUp(self.move_left_key)
        pyautogui.keyUp(self.move_right_key)
        logger.info("结束战斗，释放所有按键")

    def update_movement(self):
        """更新移动方向"""
        now = time.time()
        if now - self.last_move_switch_time > self.move_duration:
            if self.is_moving_right:
                pyautogui.keyUp(self.move_right_key)
                pyautogui.keyDown(self.move_left_key)
                logger.info('切换方向：左')
            else:
                pyautogui.keyUp(self.move_left_key)
                pyautogui.keyDown(self.move_right_key)
                logger.info('切换方向：右')
            self.is_moving_right = not self.is_moving_right
            self.last_move_switch_time = now

    def update_skills(self):
        """更新技能释放状态"""
        now = time.time()
        
        # 一技能
        if now - self.last_skill1_time >= self.skill1_interval:
            pyautogui.press(self.skill1_key)
            logger.info('释放一技能')
            self.last_skill1_time = now
        
        # 二技能
        if now - self.last_skill2_time >= self.skill2_interval:
            pyautogui.press(self.skill2_key)
            logger.info('释放二技能')
            self.last_skill2_time = now
        
        # 大招
        if now - self.last_ultimate_time >= self.ultimate_interval:
            pyautogui.press(self.ultimate_key)
            logger.info('释放大招')
            self.last_ultimate_time = now

    def combat_loop(self, duration=120, check_interval=2, check_callback=None):
        """
        战斗循环
        
        Args:
            duration: 最大战斗时长（秒）
            check_interval: 检查间隔（秒）
            check_callback: 检查回调函数，用于检查战斗是否结束
                           callback 函数应该返回 True 表示战斗结束，False 表示继续战斗
        
        Returns:
            bool: 战斗是否正常结束
        """
        try:
            start_time = time.time()
            last_check_time = start_time
            
            # 开始战斗
            self.start_combat()
            
            while time.time() - start_time < duration:
                now = time.time()
                
                # 检查战斗是否结束
                if now - last_check_time >= check_interval:
                    if check_callback and check_callback():
                        logger.info("战斗结束检查回调返回True，结束战斗")
                        return True
                    last_check_time = now
                
                # 更新移动和技能
                self.update_movement()
                self.update_skills()
                
                time.sleep(0.1)
            
            logger.warning("战斗超时")
            return False
            
        except Exception as e:
            logger.error(f"战斗循环出错: {str(e)}")
            return False
        finally:
            self.end_combat() 